from django.db.models import Q
from drf_yasg2.utils import swagger_auto_schema
from rest_framework import viewsets
from drf_yasg2 import openapi
from rest_framework.decorators import action

from PAA_ERP.utils.base_views import MultipleOpenMixin, MultipleDestroyMixin
from PAA_ERP.utils.pagination import GlobalPagination
from goods_info.models import UnitsModel
from goods_info.serializer.units_serializer import UnitsSerializers


class UnitsView(viewsets.ModelViewSet, MultipleOpenMixin, MultipleDestroyMixin):
    """
    create:
    计量单位--新增

    计量单位信息新增, status: 201(成功), return: 新增计量单位信息信息

    destroy:
    计量单位信息--删除

    计量单位信息删除, status: 204(成功), return: None

    multiple_delete:
    计量单位信息--批量删除,必传参数：ids=[1,2,3,4...]

    计量单位信息批量删除, status: 204(成功), return: None

    multiple_open:
    计量单位信息--批量启用或者禁用,必传(json)参数：ids=[1,2,3,4...](列表中可以只有一个)，is_open=1/0
    {
        "ids":[1,2],
        "is_open":"0"
    }
    is_open=1表示禁用，is_open=0表示启用，
    计量单位信息批量启用或者禁用, status: 204(成功), return: None

    update:
    计量单位信息--修改,

    计量单位信息修改, status: 200(成功), return: 修改后的计量单位信息信息

    partial_update:
    计量单位信息--局部修改,可以传参任意属性的值，服务器会修改指定的属性值 计量单位信息局部修改,

    status: 200(成功), return: 修改后的计量单位信息信息

    list: 查询所有顶级类别
    计量单位信息列表

    计量单位信息列表信息, status: 200(成功), return: 计量单位信息信息列表

    retrieve:
    查询某一个计量单位信息

    查询指定ID的计量单位信息, status: 200(成功), return: 用户计量单位信息
    """
    queryset = UnitsModel.objects.all()
    serializer_class = UnitsSerializers

    def get_queryset(self):
        if self.action == "find":  # 判断是否查询顶级列表还是某个子列表
            keyword = self.request.data.get("name", None)
            query = Q()
            if keyword:
                # 查询两个关键字
                query.add(Q(basic_name__contains=keyword), "OR")  # 多条件组合
                query.add(Q(backup_name__contains=keyword), "OR")  # 多条件组合
            return UnitsModel.objects.filter(query).all()
        else:
            return UnitsModel.objects.all()

    json_params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        'name': openapi.Schema(type=openapi.TYPE_STRING, description='计量单位'),
    })

    @swagger_auto_schema(method='post', request_body=json_params,
                         operation_description='计量单位查询')
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        return super(UnitsView, self).list(request=request, *args, **kwargs)
